# -*- coding: utf-8 -*-
# @Time    : 2024/7/15 16:22
# @Author  : yujiahao
# @File    : 28_fastapi_dependency_path.py
# @description:路径操作装饰器依赖项


'''
有时，我们并不需要在路径操作函数中使用依赖项的返回值。

或者说，有些依赖项不返回值。

但仍要执行或解析该依赖项。

对于这种情况，不必在声明路径操作函数的参数时使用 Depends，而是可以在路径操作装饰器中添加一个由 dependencies 组成的 list。
'''

# 在路径操作装饰器中添加 dependencies 参数（路径操作装饰器支持可选参数~ dependencies 且该参数的值是由 Depends() 组成的 list）

from fastapi import Depends, FastAPI, Header, HTTPException

app = FastAPI()


# todo 依赖项错误和返回值
# 路径装饰器依赖项也可以使用普通的依赖项函数。
# 路径装饰器依赖项可以声明请求的需求项（比如响应头）或其他子依赖项
async def verify_token(x_token: str = Header()):
    # todo 无论路径装饰器依赖项是否返回值，路径操作都不会使用这些值。
    if x_token != "fake-super-secret-token":
        raise HTTPException(status_code=400, detail="X-Token header invalid")


async def verify_key(x_key: str = Header()):
    # todo 触发异常
    # 路径装饰器依赖项与正常的依赖项一样，可以 raise 异常
    if x_key != "fake-super-secret-key":
        raise HTTPException(status_code=400, detail="X-Key header invalid")
    return x_key


# todo 注意这里是在操作路径里面直接放一个list的依赖
@app.get("/items/", dependencies=[Depends(verify_token), Depends(verify_key)])
async def read_items():
    '''

    有些编辑器会检查代码中没使用过的函数参数，并显示错误提示。

    在路径操作装饰器中使用 dependencies 参数，可以确保在执行依赖项的同时，避免编辑器显示错误提示。

    使用路径装饰器依赖项还可以避免开发新人误会代码中包含无用的未使用参数。

    例中，使用的是自定义响应头 X-Key 和 X-Token。

    但实际开发中，尤其是在实现安全措施时，最好使用 FastAPI 内置的安全工具（详见下一章）。


    '''
    return [{"item": "Foo"}, {"item": "Bar"}]
